home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / shot.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  2KB  |  123 lines

  1. #include <xsp2lib.h>
  2.  
  3. #include "otoko.h"
  4. #include "player.h"
  5. #include "shot.h"
  6. #include "priority.h"
  7.  
  8. #ifndef NULL
  9. #define NULL ((void *) 0)
  10. #endif
  11.  
  12. #define SHOT_MAX    24    /* ショット最大数 */
  13. static SHOT shot[SHOT_MAX];    /* ワーク */
  14.  
  15. #define DISP_OFFSET_X    (-8)    /* (x,y)+(-8,-8) にスプライトを表示 */
  16. #define DISP_OFFSET_Y    (-8)
  17.  
  18. #define SHOT_SPEED    31
  19.  
  20.  
  21. /* 起動時に1度だけ呼ばれる */
  22. void ShotInit0 (void)
  23. {
  24.     int i;
  25.  
  26.     /* リストをつなげる */
  27.     shot_top = NULL;
  28.     shot_null_top = shot;
  29.     for (i = 0; i < SHOT_MAX; i++)
  30.         shot[i].next = &shot[i + 1];
  31.  
  32.     shot[SHOT_MAX - 1].next = NULL;
  33. }
  34.  
  35.  
  36.  
  37. /* ショット出現時に呼ばれる */
  38. void ShotInit (unsigned char angle)
  39. {
  40.     SHOT *p;
  41.  
  42.     if (shot_null_top == NULL)    /* ワークの空きはあるか? */
  43.         return;
  44.  
  45.     p = shot_null_top;
  46.     shot_null_top = p->next;
  47.     p->next = shot_top;
  48.     shot_top = p;
  49.  
  50.     p->lx = (player->x) << 16;    /* ショットの座標は自機+(0,-16) */
  51.     p->ly = (player->y + 4) << 16;    /* 自機の少し上に出す */
  52.     p->pt = sp_shot + pt_rot[angle];
  53.     p->info = 0x0100 | PRIORITY_SHOT | info_rot[angle];
  54. #if    0
  55.     0b xxxx_xxxx
  56.       0 ~ 63:0
  57.       64 ~ 127:4
  58.       128 ~ 191:8
  59.       192 ~ 255:c
  60. #endif
  61.       p->damage = 0;
  62.     p->frame = -1;
  63.     p->vx = vxtable[SHOT_SPEED][angle];
  64.     p->vy = vytable[SHOT_SPEED][angle];
  65. }
  66.  
  67.  
  68.  
  69. /* 垂直同期ごとに呼ばれる */
  70. void ShotMove (void)
  71. {
  72.     SHOT *p, *q;
  73.  
  74.     p = shot_top;        /* 現在注目しているワーク */
  75.     q = NULL;        /* 1つ前のワーク(ワーク削除時に必要) */
  76.     while (p != NULL) {
  77.         /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  78.         p->x = ((p->lx += p->vx) >> 16) + DISP_OFFSET_X;
  79.         p->y = ((p->ly += p->vy) >> 16) + DISP_OFFSET_Y;
  80.  
  81.         p->frame++;
  82.         /* ショットが敵に当たった又は画面外に出たか? */
  83.         /* (画面右から出た判定と左から出た判定を1回の比較で行っている事に注目) */
  84.         if ((p->damage)
  85.             || ((unsigned short) (p->x) > 256 + 16 - DISP_OFFSET_X)
  86.             || ((unsigned short) (p->y) > 256 + 16 - DISP_OFFSET_Y)) {
  87.  
  88.             if (q == NULL) {    /* リストの一番最初を削除 */
  89.                 shot_top = p->next;
  90.                 p->next = shot_null_top;
  91.                 shot_null_top = p;
  92.                 q = NULL;
  93.                 p = shot_top;
  94.             } else {
  95.                 q->next = p->next;
  96.                 p->next = shot_null_top;
  97.                 shot_null_top = p;
  98.                 p = q->next;
  99.             }
  100.         } else {
  101.             xsp_set_st (p);
  102.             q = p;
  103.             p = p->next;
  104.         }
  105.     }
  106. }
  107.  
  108.  
  109.  
  110. /* ショット消去時に呼ばれる(面クリア等) */
  111. void ShotTini (void)
  112. {
  113.     int i;
  114.  
  115.     /* リストをつなげる */
  116.     shot_top = NULL;
  117.     shot_null_top = shot;
  118.     for (i = 0; i < SHOT_MAX; i++)
  119.         shot[i].next = &shot[i + 1];
  120.  
  121.     shot[SHOT_MAX - 1].next = NULL;
  122. }
  123.